package com.lenovo.lcdm.type.service;

import com.lenovo.lcdm.type.dto.*;
import com.lenovo.lcdm.type.entity.TypeDefinition;
import com.baomidou.mybatisplus.extension.service.IService;
import com.lenovo.lcdm.type.entity.TypeDefinitionMaster;

import java.util.List;

/**
* @author xujing30
* @description 针对表【type_definition】的数据库操作Service
* @createDate 2024-01-03 17:51:42
*/
public interface TypeDefinitionService extends IService<TypeDefinition> {

    /**
     * 查询根目录下所有类型定义,不包含属性
     * @return
     */
    TypeDefinitionDTO queryRootTypes();

    /**
     * 查询详细及local attribute
     * @param typeId
     * @return
     */
    TypeDefinitionDTO queryDetail(Long typeId);

    /**
     * 查询详细及local attribute
     * @param typeInternalName
     * @return
     */
    TypeDefinitionDTO queryDetail(String typeInternalName);

    /**
     * 查询类型下所有本地属性-包含从父类型继承的
     * @param typeId
     * @return
     */
    List<LocalAttributeDTO> queryAllLocalAttribute(Long typeId);

    /**
     *
     * @description 获取当前类型下的属性
     * @param definition
     * @return
     */
    TypeDefinitionDTO findTypeDefinitionAttribute(TypeDefinition definition);

    /**
     * 内部名称是否存在
     * @param internalName
     * @return
     */
    List<TypeDefinitionMaster> findByInternalName(String internalName);

    /**
     * 保存类型定义
     * @param typeDefinitionDTO
     */
    void saveTypeDefinition(TypeDefinitionDTO typeDefinitionDTO);

    /**
     * 更新类型定义
     * @param typeDefinitionDTO
     */
    void updateTypeDefinition(TypeDefinitionDTO typeDefinitionDTO);

    /**
     * 查找子类型
     * @param parentId
     * @return
     */
    List<TypeDefinition> queryByParentId(Long parentId);

    /**
     * 删除类型定义
     * checkSub - 如果存在子类型，是否限制删除类型
     * checkAttribute - 如果存在localAttribute是否限制删除类型
     * @param typeId
     */
    void deleteTypeDefinition(Long typeId, boolean checkSub, boolean checkAttribute, boolean checkActualValue);

    /**
     * 属性排序
     * @param localAttributeSortDTO
     */
    void saveSortAttribute(LocalAttributeSortDTO localAttributeSortDTO);

    /**
     * 查询顶级父类型
     * @param typeId
     * @return
     */
    TypeDefinition getRootTypeDefinition(Long typeId);

    /**
     * 递归查找当前类型下所有类型及属性
     * @param definition
     * @return
     */
    TypeDefinitionDTO findTypeDefinitionAttributeRecursion(TypeDefinition definition);

    /**
     * 删除属性排序
     * @param localAttributeLinkId
     * @param typeId
     */
    void deleteAttributeSort(Long localAttributeLinkId, Long typeId);

    List<TypeDefinition> findAll();

    void groupSort(GroupSortDTO groupSortDTO);

    /**
     * 查询类型定义树
     * @param typeInternalName
     * @return
     */
    TypeDefinitionTreeDTO findTypeMultipleLevelTree(String typeInternalName);

    TypeDefinitionTreeDTO findTypeMultipleLevelTree(long typeId);

    TypeDefinition queryByTypeInternalName(String typeInternalName);

    TypeDefinitionTreeDTO findTypeMultipleLevelTree(TypeDefinition definition);


}
